package com.hds.modules.sys.controller.base;


import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.hds.common.upload.UploadUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.hds.common.exception.RRException;
import com.hds.common.utils.R;
import com.hds.common.validator.Assert;
import com.hds.modules.sys.entity.constant.ResCode;
import com.hds.modules.sys.entity.base.dto.Imgs;
import com.hds.modules.sys.entity.config.UploadFileConfig;


/**
 * 文件上传
 * @Function TODO
 * 
 * 	file -- 查询上传文件
 *  libs -- 从素材库中查询文件
 * @date 2018年03月01日
 */
@Controller
@RequestMapping("/sys/file")
public class SysUploadController {

	@Autowired
	UploadFileConfig uploadFileConfig;

	public static final String MARKER_LIBS="libs_";


	/**
	 * 通过url请求返回图像的字节流
	 * imageName:过滤掉特殊字符"."
	 */
	@RequestMapping(value={"/{imageName:.+}"})
	public void getIcon(HttpServletRequest request,
						HttpServletResponse response,
						@PathVariable("imageName") String imageName,
						@RequestParam(value="w",required=false) Integer width,
						@RequestParam(value="h",required=false) Integer height) throws IOException {

		UploadUtils.getIcon(request, response, uploadFileConfig, imageName, width, height);

	}




	/**
	 * 文件上传具体实现方法（单文件上传）
	 * @param file
	 * @param thumbWidth 图片缩放宽度
	 * @param thumbHeight 图片缩放高度
	 * @desc 如果thumbWidth,thumbHeight都为空的话，只上传原图。
	 * @return
	 */
	@RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
	@ResponseBody
	public R upload(HttpServletRequest request,
					@RequestParam(value="w",required=false) Integer thumbWidth,
					@RequestParam(value="h",required=false) Integer thumbHeight,
					@RequestParam("file") MultipartFile file) {

		try {
			return UploadUtils.upload(request, thumbWidth, thumbHeight, uploadFileConfig, file);
		}catch(Exception e){
			throw new RRException("文件上传失败,原因：" + e.getMessage());
		}


	}





	//	Logger logger = LoggerFactory.getLogger(UploadController.class);
//
//	@Autowired
//	UploadFileConfig uploadFileConfig;
//
//	public static final String MARKER_LIBS="libs_";
//
//	/**
//     * 通过url请求返回图像的字节流
//     * imageName:过滤掉特殊字符"."
//     */
//    @RequestMapping(value={"/{imageName:.+}"})
//    public void getIcon(HttpServletRequest request,
//    		HttpServletResponse response,
//    		@PathVariable("imageName") String imageName,
//    		@RequestParam(value="w",required=false) Integer width,
//    		@RequestParam(value="h",required=false) Integer height) throws IOException {
//
//    	String prefix=null;
//		try {
//			prefix = imageName.substring(0,MARKER_LIBS.length());
//		} catch (Exception e) {
//			logger.info("======imageName error==imageName:{}====", imageName);
//			throw new RRException(e.getMessage());
//		}
//    	Assert.isBlank(imageName, "图片名不能为空.");
//
//    	String fileName = null;
//    	if(imageName!=null && MARKER_LIBS.equals(prefix)) {
//    		fileName=uploadFileConfig.getFileLibraryStoragePath() + imageName;
//    	}else{
//    		fileName=uploadFileConfig.getFileStoragePath() + imageName;
//    	}
//    	System.out.println("libs  fileName="+fileName);
//        File file = new File(fileName);
//        if(!file.exists())
//    	{
//    	   throw new RRException("文件不存在");
//    	}
//
//        BufferedImage im = ImageIO.read(file);
//        /* 原始图像的宽度和高度  */
//        int orinWidth = im.getWidth();
//        int orinHeight = im.getHeight();
//
//        FileInputStream inputStream = new FileInputStream(file); //原始文件的输入流
//        byte[] data = new byte[(int)file.length()]; //原始文件的字节长度
//
//        int length = inputStream.read(data);
//        inputStream.close();
//        response.setContentType("image/jpg");
//
//        byte [] buf = null;
//        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
//        OutputStream stream = response.getOutputStream();
//
//        if(width==null || width >= orinWidth || width<=0){
//        	width = orinWidth;
//        }
//        if(height==null || height >= orinHeight || height<=0){
//        	height = orinHeight;
//        }
//
//        Thumbnails.of(file).size(width,height).toOutputStream(outputStream);
//        buf = outputStream.toByteArray();
//
//        stream.write(buf);
//        stream.flush();
//        stream.close();
//        outputStream.flush();
//        outputStream.close();
//    }
//
//
//
//
//
//	 /**
//     * 文件上传具体实现方法（单文件上传）
//     * @param file
//     * @param thumbWidth 图片缩放宽度
//     * @param thumbHeight 图片缩放高度
//     * @desc 如果thumbWidth,thumbHeight都为空的话，只上传原图。
//     * @return
//     */
//    @RequestMapping(value = "/upload", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
//    @ResponseBody
//    public R upload(HttpServletRequest request,
//    		@RequestParam(value="w",required=false) Integer thumbWidth,
//    		@RequestParam(value="h",required=false) Integer thumbHeight,
//    		@RequestParam("file") MultipartFile file) {
//
//        if (!file.isEmpty()) {
//        	long maxSize=uploadFileConfig.getMaxSize();//文件允许上传的最大尺寸（5M）
//        	long currFileSize = file.getSize() / 1024;//上传文件的大小(K)
//
//        	if(currFileSize > maxSize){
//        		return R.error(ResCode.UPLOAD_FILE_MAX_SIZE, ResCode.UPLOAD_FILE_MAX_SIZE_DESC+maxSize+"KB");
//        	}
//
//        	String fileName="",thumbName="",finalName="";
//        	//String currDate = DateUtils.format(new Date(), "yyyyMMdd");
//        	try {
//            	fileName = file.getOriginalFilename();
//            	if(isSupportCurrentSuffix(fileName)){
//            		String suff=fileName.substring(fileName.lastIndexOf("."), fileName.length());
//            		//生成uuid
//                    finalName = UUID.randomUUID().toString().replaceAll("-", "") + suff;
//            	}else{
//            		return R.error(ResCode.UPLOAD_FILE_SUFFIX_IS_SUPPORT, ResCode.UPLOAD_FILE_SUFFIX_IS_SUPPORT_DESC);
//            	}
//
////                String filePath = request.getServletContext().getRealPath("storage/");
//////                		+ currDate + "/";
////            	String filePath = "E:/ABB/" + DateUtils.format(new Date(), "yyyyMMdd") + "/";
//            	String filePath = uploadFileConfig.getFileStoragePath(); //上传文件的存储路径
//                logger.info("filePath:{}",filePath);
//                //原文件上传
//				uploadFile(file.getBytes(), filePath, finalName);
//				//生成缩略图
//				thumbName = createThumbImage(file, thumbWidth, thumbHeight, filePath , finalName);
//
//            } catch (FileNotFoundException e) {
//                e.printStackTrace();
//                throw new RRException("上传失败," + e.getMessage());
//            } catch (IOException e) {
//                e.printStackTrace();
//                throw new RRException("上传失败," + e.getMessage());
//            }catch (Exception e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//        	R r = R.ok("上传成功").put("fileName", finalName);
//        	if(thumbName!=null && !"".equals(thumbName)){
//        		r.put("thumbName", thumbName);
//        	}
//            return r;
//        } else {
//        	return R.error(ResCode.UPLOAD_FILE_IS_NULL, ResCode.UPLOAD_FILE_IS_NULL_DESC);
//        }
//    }
//
//
//
//	 /**
//     * 文件上传具体实现方法（多文件上传）
//     * @param files
//     * @return
//     */
//    @RequestMapping(value = "/uploadFiles", method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
//    @ResponseBody
//    public R upload(HttpServletRequest request,
//    		@RequestParam("files") MultipartFile[] files) {
//
//    	R r =null;
//    	List<String> list = new ArrayList<String>();
//        if (files != null && files.length > 0) {
//            for (int i = 0; i < files.length; i++) {
//                MultipartFile file = files[i];
//
//                long maxSize=uploadFileConfig.getMaxSize();//文件允许上传的最大尺寸（5M）
//            	long currFileSize = file.getSize() / 1024;//上传文件的大小(K)
//
//            	if(currFileSize > maxSize){
//            		return R.error(ResCode.UPLOAD_FILE_MAX_SIZE, ResCode.UPLOAD_FILE_MAX_SIZE_DESC+maxSize+"KB");
//            	}
//
//            	String fileName="",thumbName="",finalName="";
//            	//String currDate = DateUtils.format(new Date(), "yyyyMMdd");
//            	try {
//                	fileName = file.getOriginalFilename();
//                	if(isSupportCurrentSuffix(fileName)){
//                		String suff=fileName.substring(fileName.lastIndexOf("."), fileName.length());
//                		//生成uuid
//                        finalName = MARKER_LIBS+UUID.randomUUID().toString().replaceAll("-", "") + suff;
//                	}else{
//                		return R.error(ResCode.UPLOAD_FILE_SUFFIX_IS_SUPPORT, ResCode.UPLOAD_FILE_SUFFIX_IS_SUPPORT_DESC);
//                	}
//                	String filePath = uploadFileConfig.getFileLibraryStoragePath(); //上传文件的存储路径
//                    //原文件上传
//    				uploadFile(file.getBytes(), filePath, finalName);
//    				list.add(finalName);
//                } catch (FileNotFoundException e) {
//                    e.printStackTrace();
//                    throw new RRException("上传失败," + e.getMessage());
//                } catch (IOException e) {
//                    e.printStackTrace();
//                    throw new RRException("上传失败," + e.getMessage());
//                }catch (Exception e) {
//    				// TODO Auto-generated catch block
//    				e.printStackTrace();
//    			}
//
//            }
//            r = R.ok("上传文件完成").put("fileNames", list);
//            return r;
//
//
//        } else {
//        	return R.error(ResCode.UPLOAD_FILE_IS_NULL, ResCode.UPLOAD_FILE_IS_NULL_DESC);
//        }
//    }
//
//
//
//    /**
//     * 从文件库中删除文件
//     * @return
//     */
//    @RequestMapping(value="/libs/delete", method = RequestMethod.POST)
//    @ResponseBody
//    public R libsDelete(@RequestBody Imgs img){
//    	String[] suffixs = uploadFileConfig.getSuffixs(); //允许的文件后缀列表
//    	List<String> nameList= img.getNames();
//    	R r=R.ok();
//    	if(nameList!=null && nameList.size()>0){
//    		for (String fileName : nameList) {
//            	boolean b = delFile(uploadFileConfig.getFileLibraryStoragePath() + fileName, suffixs);
//            	if(!b){
//            		r.put("ms", fileName+"文件删除失败");
//            	}
//			}
//    	}
//    	return r;
//
//    }
//
//
//    public static boolean delFile(String fileName, String[] suffixs){
//    	for (String suff : suffixs) {
//    		String fName = fileName + "."+suff;
//    		File f = new File(fName);
//    		if(f.exists() && f.isFile()){
//                boolean t = f.delete();
//               return t;
//            }
//		}
//    	return false;
//
//    }
//
//
//    /**
//     * 显示文件库中的所有文件
//     * @return
//     */
//    @RequestMapping("/libs/list")
//    @ResponseBody
//    public R libsList(HttpServletRequest request) {
//    	String directoryPath = uploadFileConfig.getFileLibraryStoragePath(); // 需要遍历的文件夹路径
//    	boolean isAddDirectory = false; // 是否将子文件夹的路径也添加到list集合中
//
//    	return R.ok().put("list", getAllFile(directoryPath, isAddDirectory));
//    }
//
//
//    /**
//     * 获取路径下的所有文件/文件夹
//     * @param directoryPath 需要遍历的文件夹路径
//     * @param isAddDirectory 是否将子文件夹的路径也添加到list集合中
//     * @return
//     */
//    public static List<String> getAllFile(String directoryPath,boolean isAddDirectory) {
//        List<String> list = new ArrayList<String>();
//        File baseFile = new File(directoryPath);
//        if (baseFile.isFile() || !baseFile.exists()) {
//            return list;
//        }
//        File[] files = baseFile.listFiles();
//        for (File file : files) {
//            if (file.isDirectory()) {
//                if(isAddDirectory){
//                    list.add(file.getName());
//                }
//                list.addAll(getAllFile(file.getName(),isAddDirectory));
//            } else {
//                list.add(file.getName());
//            }
//        }
//        return list;
//    }
//
//
//    /**
//     * 生成缩略图
//     * @param file
//     * @param thumbWidth
//     * @param thumbHeight
//     * @param filePath（路径+名称）
//     * @throws IOException
//     */
//    public static String createThumbImage(MultipartFile file, Integer thumbWidth, Integer thumbHeight, String filePath, String finalName) throws IOException {
//
//    	String thumbSuffix = finalName.substring(finalName.lastIndexOf("."), finalName.length());
//	    String pureThumbName = finalName.substring(0,finalName.lastIndexOf("."));
//	    String thumbName = pureThumbName + "_thumb" + thumbSuffix;
//
//    	BufferedImage image = ImageIO.read(file.getInputStream());
//    	if (image != null) {	//如果image=null 表示上传的不是图片格式
//			int w = image.getWidth();	//获取图片宽度，单位px
//			int h = image.getHeight();	//获取图片高度，单位px
//
//			if(thumbWidth != null && thumbHeight != null ){
//                if(thumbWidth != w){
//					////缩略图的宽/高(不按比例，按照指定宽高缩放),如果上传的图片宽度和将要压缩的指定宽度相等，则返回原图，不进行压缩
//	                Thumbnails.of(file.getInputStream()).size(thumbWidth,thumbHeight).keepAspectRatio(false).toFile(filePath + thumbName);
//                	//Thumbnails.of(file.getInputStream()).forceSize(thumbWidth,thumbWidth).toFile(filePath + thumbName);
//                }
//			}
//			return thumbName;
//		}
//    	return null;
//    }
//
//    /**
//     * 文件上传
//     * @param file
//     * @param filePath
//     * @param fileName
//     * @throws Exception
//     */
//    public static void uploadFile(byte[] file, String filePath, String fileName) throws Exception {
//        File targetFile = new File(filePath);
//        if(!targetFile.exists()){
//            targetFile.mkdirs();
//        }
//        FileOutputStream out = new FileOutputStream(filePath+fileName);
//        out.write(file);
//        out.flush();
//        out.close();
//    }
//
//
//    /**
//	 * 根据文件名后缀判断上传的文件格式
//	 * @param fileName
//	 * @return
//	 */
//	public boolean isSupportCurrentSuffix(String fileName){
//		String[] suffixs=uploadFileConfig.getSuffixs();
//		logger.info("suffix:{}",suffixs.length);
//		String currSuffix =fileName.substring(fileName.lastIndexOf(".")+1, fileName.length()); //后缀
//		if(Arrays.asList(suffixs).contains(currSuffix) && fileName.lastIndexOf(".") > -1){
//			System.out.println(fileName);
//			return true;
//		}
//		return false;
//
//	}




    /**
     *根据文件名mineType 检查文件格式
     * <entry key="image/gif" value="gif" />
		<entry key="image/jpeg" value="jpg" />
		<entry key="image/pjpeg" value="jpg" />
		<entry key="image/png" value="png" />
		<entry key="image/x-png" value="png" />
		<entry key="application/pdf" value="pdf" />
		<entry key="application/rtf" value="rtf" />
		<entry key="application/msword" value="doc" />
		<entry key="application/vnd.openxmlformats-officedocument.wordprocessingml.document" value="docx" />
		<entry key="application/vnd.ms-powerpoint" value="ppt" />
		<entry key="application/vnd.openxmlformats-officedocument.presentationml.presentation" value="pptx" />
		<entry key="audio/mpeg3" value="mp3" />
		<entry key="application/vnd.ms-excel" value="xls" />
		<entry key="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" value="xlsx" />
		<entry key="application/x-zip-compressed" value="$" />
		<entry key="application/octet-stream" value="$" />
		<entry key="application/iphone-package-archive" value="ipa" />
		<entry key="application/vnd.android.package-archive" value="apk" />
     * @param file
     */
//    public void checkFileFormat(MultipartFile file){
//    	Map<String,String> contentTypeMap = new HashMap<String,String>();
//    	// 检查文件格式
//		String contenType = file.getContentType();
//		String format = contentTypeMap.get(contenType);
//		logger.info("检查文件格式... ContenType:{}, Format:{}", contenType, format);
//
//		if (format == null) {
//			logger.info("文件格式暂时不支持... ContenType:{}, Format:{}", contenType, format);
//			return;
//		}
//    }
    
    
}
